package servers;

import interfaces.CommServerInterface;
import interfaces.SynchroServerInterface;
import processus.Processus_1;
import processus.Processus_2;


import java.rmi.AlreadyBoundException;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.rmi.server.UnicastRemoteObject;




/**
 * Gestionnaire de prototype
 * Résponsable du lancement des serveurs et des processus
 */

public class PrototypeManager {

	/**
	 * @param args
	 * @throws RemoteException 
	 * @throws AlreadyBoundException 
	 * @throws NotBoundException 
	 */
	public static void main(String[] args) throws RemoteException, AlreadyBoundException, NotBoundException {
		
		/** localiser le serveur de noms (rmiRegistry) */
		Registry registry = LocateRegistry.getRegistry("localhost");
		
		/** Creer l'objet serveur de communication */
		CommServerInterface server_comm = new CommServer();
		
		/** Creer l'objet serveur de log */
		LogServer
		
		/** enregistrer le serveur de communication au niveau du rmiregistry */
		UnicastRemoteObject.exportObject(server_comm, 0);
		registry.bind("SERVER_COMM", server_comm);
		System.out.println("Serveur de communication enregistré");

		/** Instancier les serveurs de synchronisation */ 		
 		SynchroServerInterface synch = new SynchroServer("sync", 2);
 		UnicastRemoteObject.exportObject(synch, 0);
 		registry.bind("sync", synch); 
 		System.out.println("Serveur de synchronisation sync enregistré");
 		
 		/** Instancier toutes les instances des processus */
 		
 		/** processus Processus_1*/
 		for(int i=0; i<Processus_1.nbThreads; i++){
 			Processus_1 p = new Processus_1(i);
 			p.start();
 		}
 		
 		/** processus Processus_2*/
 		for(int i=0; i<Processus_2.nbThreads; i++){
 			Processus_2 p = new Processus_2(i);
 			p.start();
 		}		 		
         
    }
}

